<?php

declare(strict_types=1);
/**
 * Copyright (c) The Magic , Distributed under the software license
 */

namespace App\Infrastructure\ExternalAPI\Sms\Enum;

/**
 * 电话的国际区号代码
 */
enum InternationalPhoneCodeEnum: string
{
    case SINGAPORE = '65';
    case MALAYSIA = '60';
    case INDONESIA = '62';
    case THAILAND = '66';
    case PHILIPPINES = '63';
    case VIETNAM = '84';
    case CHINA = '86';

    /**
     * 所有国际区号.
     * @return string[]
     */
    public static function InternationalCodes(): array
    {
        return [
            '244',
            '93',
            '355',
            '213',
            '376',
            '1264',
            '1268',
            '54',
            '374',
            '247',
            '61',
            '43',
            '994',
            '1242',
            '973',
            '880',
            '1246',
            '375',
            '32',
            '501',
            '229',
            '1441',
            '591',
            '267',
            '55',
            '673',
            '359',
            '226',
            '95',
            '257',
            '237',
            '1',
            '1345',
            '236',
            '235',
            '56',
            '86',
            '57',
            '242',
            '682',
            '506',
            '53',
            '357',
            '420',
            '45',
            '253',
            '593',
            '20',
            '503',
            '372',
            '251',
            '679',
            '358',
            '33',
            '594',
            '241',
            '220',
            '995',
            '49',
            '233',
            '350',
            '30',
            '1473',
            '1671',
            '502',
            '224',
            '592',
            '509',
            '504',
            '852',
            '36',
            '354',
            '91',
            '62',
            '98',
            '964',
            '353',
            '972',
            '39',
            '1876',
            '81',
            '962',
            '855',
            '7',
            '254',
            '82',
            '965',
            '996',
            '856',
            '371',
            '961',
            '266',
            '231',
            '218',
            '423',
            '370',
            '352',
            '853',
            '261',
            '265',
            '60',
            '960',
            '223',
            '356',
            '1670',
            '596',
            '230',
            '52',
            '373',
            '377',
            '976',
            '1664',
            '212',
            '258',
            '264',
            '674',
            '977',
            '599',
            '31',
            '64',
            '505',
            '227',
            '234',
            '850',
            '47',
            '968',
            '92',
            '507',
            '675',
            '595',
            '51',
            '63',
            '48',
            '689',
            '351',
            '1787',
            '974',
            '262',
            '40',
            '7',
            '1758',
            '1784',
            '684',
            '685',
            '378',
            '239',
            '966',
            '221',
            '248',
            '232',
            '65',
            '421',
            '386',
            '677',
            '252',
            '27',
            '34',
            '94',
            '249',
            '597',
            '268',
            '46',
            '41',
            '963',
            '886',
            '992',
            '255',
            '66',
            '228',
            '676',
            '1868',
            '216',
            '90',
            '993',
            '256',
            '380',
            '971',
            '44',
            '1',
            '598',
            '998',
            '58',
            '84',
            '967',
            '381',
            '263',
            '260',
            '297',
            '975',
            '387',
            '238',
            '269',
            '243',
            '385',
            '1849',
            '240',
            '5',
            '298',
            '45',
            '590',
            '245',
            '389',
            '222',
            '691',
            '382',
            '687',
            '6723',
            '680',
            '970',
            '250',
            '1869',
            '381',
            '211',
            '678',
            '1284',
            '225',
            '1767',
            '670',
            '291',
            '681',
            '1340',
            '688',
            '1809',
            '690',
            '692',
            '686',
            '1808',
            '508',
            '683',
            '39',
            '1808',
            '7',
            '684',
            '44',
            '61',
            '61',
            '685',
            '33',
            '64',
            '7',
            '590',
            '262',
            '44',
            '44',
            '382',
            '389',
            '381',
            '243',
            '239',
            '211',
            '670',
            '686',
            '683',
            '590',
            '599',
            '508',
        ];
    }

    /**
     * 允许向这些国家发送短信.
     * 中国号码不允许使用国际短信接口进行发送
     */
    public static function allowCountryCodes(): array
    {
        return [
            self::SINGAPORE,
            self::MALAYSIA,
            self::INDONESIA,
            self::THAILAND,
            self::PHILIPPINES,
            self::VIETNAM,
        ];
    }

    /**
     * 去掉手机号的"+"号,以及可能存在的"-","00".
     * @example +8613104871111
     * @example +86-13104871111
     * @example +0086-13104871111
     */
    public static function parsePhoneInternationalPhone(string $phone): string
    {
        $phone = ltrim($phone, '+0');
        return str_replace('-', '', $phone);
    }

    /**
     * 判断是否非中国手机号.
     */
    public static function isInternationalPhone(string $phone): bool
    {
        if (str_starts_with($phone, '+' . self::CHINA->value) || str_starts_with($phone, self::CHINA->value)) {
            return false;
        }
        // 判断国际区号
        if (str_contains($phone, '+') || str_contains($phone, '-')) {
            return true;
        }
        return false;
    }
}
